package cron

import (
	"cloudops/src/common"
	"cloudops/src/pbms"
	"context"
	"fmt"
	"go.uber.org/zap"
	"k8s.io/apimachinery/pkg/util/wait"
	"math/rand"
	"os"
	"time"
)

// 多久上报一次信息
func (c *CronManager) InfoReportMagager(ctx context.Context) error {
	go wait.UntilWithContext(ctx, c.RunInfoReport, time.Duration(c.Client.Sc.InfoCollectC.RunIntervalSeconds)*time.Second)
	<-ctx.Done()
	c.Client.Sc.Logger.Info("InfoReportManager 收到退出信号，退出InfoReportManager")
	return nil
}

// 执行上报信息
func (c *CronManager) RunInfoReport(ctx context.Context) {
	c.Client.Sc.Logger.Info("开始上报信息")

	conn, err := c.Client.Pool.Get()
	if err != nil {
		c.Client.Sc.Logger.Error("计划任务-信息采集上报,获取连接失败", zap.Error(err))
		return
	}
	defer conn.Close()

	client := pbms.NewInfoReporterClient(conn.Value())
	ctx, cancel := c.Client.GenTwContext()
	defer cancel()

	nodeInfo := common.GetNodeInfo()
	// Todo： 部署的时候需要打开注释掉这个sn
	//	sn := nodeInfo.Node.MachineID

	// Todo：在实际部署的时候需要注释掉这个sn
	// Todo： 固定sn 是因为MAC系统和windows系统获取sn的方式不一样
	// Todo： Linux是固定的所以才固定写上去尝试改变磁盘的形式去模拟更新
	sn := "abc"
	// 模拟 disk每次发生变化 增量更新
	frn := func(n int) int {
		rand.Seed(time.Now().UnixNano())
		return rand.Intn(n)
	}

	resp, err := client.AgentInfoReport(ctx, &pbms.AgentInfoReportRequest{
		Hostname: c.Client.Sc.HostName,

		AgentVersion: common.AGENT_VERSION,
		Ip:           c.Client.Sc.LocalIp,
		Env:          os.Getenv(common.AGENT_VAR_ENV),
		Sn:           sn,
		//Sn:           nodeInfo.Node.MachineID, // Todo： 部署的时候需要打开注释掉这个sn
		OsType: nodeInfo.OsType,
		OsName: nodeInfo.OS.Name,
		Cpu:    int32(nodeInfo.CPU.Threads),
		Mem:    int32(nodeInfo.Memory.Size),
		Disk:   int32(frn(100)),
	})

	if err != nil {
		c.Client.Sc.Logger.Error("计划任务-信息采集上报,上报失败", zap.Error(err))
		return
	}
	// 尝试获取主机名
	hostname, err := os.Hostname()
	if err != nil {
		c.Client.Sc.Logger.Error("获取主机名失败", zap.Error(err))
		return
	}
	c.Client.Sc.HostName = hostname
	fmt.Println("获取到的主机名:", c.Client.Sc.HostName)

	c.Client.Sc.Logger.Info("计划任务-信息采集上报,上报成功", zap.String("status", resp.Status), zap.Any("结果", resp))
}
